home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Programming / AmigaTalk / examples / DiningPhilosophers.st < prev    next >
Text File  |  1998-09-30  |  2KB  |  75 lines

  1. " Example of the Dining Philosophers computing problem."
  2. Class  Main
  3. [
  4.   main
  5.     (DiningPhilosophers new: 5) dine: 4
  6. ]
  7.  
  8. Class  DiningPhilosophers
  9. | diners  forks  philosophers |
  10. [
  11.   new: aNumber
  12.     diners       <- aNumber.
  13.     forks        <- Array new: aNumber.
  14.     philosophers <- Array new: aNumber.
  15.     (1 to: diners) do: [:p | forks at: p put: (Semaphore new: 1).
  16.                          philosophers at: p put: (Philosopher new: p)
  17.                        ]
  18. |
  19.   dine: time
  20.     (1 to: diners) do: [:p | (philosophers at: p)
  21.                              leftFork: (forks at: p)
  22.                              rightFork: (forks at: ((p \\ diners) + 1))
  23.                        ].
  24.     time timesRepeat: [(1 to: diners) do: [:p | (philosophers at: p) 
  25.                               philosophize]
  26.                       ].
  27.  
  28.     (1 to: diners) do: [:p | (philosophers at: p) sleep]
  29. ]
  30.  
  31. Class  Philosopher
  32. | leftFork  rightFork  myName  myPhilosophy |
  33. [
  34.   new:  name
  35.     myName       <- name.
  36.     myPhilosophy <- [[true] 
  37.                      whileTrue: [ self think.
  38.                                   self getForks.
  39.                                   self eat.
  40.                                   self releaseForks.
  41.                                   selfProcess suspend
  42.                                 ]
  43.                     ] newProcess
  44. |
  45.   leftFork: lfork  rightFork: rfork
  46.     leftFork  <- lfork.
  47.     rightFork <- rfork
  48. |
  49.   getForks
  50.     ((myName \\ 2) == 0)
  51.       ifTrue:  [leftFork  wait.  rightFork wait]
  52.       ifFalse: [rightFork wait.  leftFork  wait]
  53. |
  54.   releaseForks
  55.     leftFork  signal.
  56.     rightFork signal
  57. |
  58.   think
  59.     ('Philosopher ',(myName asString),' is thinking.') print.
  60.     10 timesRepeat: [selfProcess yield]
  61. |
  62.   eat
  63.     ('Philosopher ',(myName asString),' is eating.') print.
  64.     10 timesRepeat: [selfProcess yield]
  65.  
  66. |
  67.   philosophize
  68.     myPhilosophy resume
  69. |
  70.   sleep
  71.     myPhilosophy terminate.
  72.     ('Philosopher ',(myName asString),' is sleeping.') print.
  73.     myPhilosophy <- nil
  74. ]
  75.